package com.dd.shop4j.website.member.security;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.dd.shop4j.member.model.MemberInfo;

/**
 * 会员的认证拦截器
 * @ClassName: UserSecurityInterceptor
 * @Description: TODO <br />
 * 	该类主要是判断用户是否登录，如果没有登录，就跳转至登录页面
 * @author 唐小恕
 * @date 2013年12月19日 下午6:28:43
 *
 */
public class UserSecurityInterceptor extends HandlerInterceptorAdapter {
	
	//会员登录的token
	public static final String loginSessionToken = "DD-SHOP-MEMBER-LOGIN-LOGIN";
	//登录的地址，当没有登录时，会自动跳到此地址
	private String loginUrl;
	//登录成功后，跳转的地址
	private String successUrl;
	//不需过滤的url地址列表
	private List<String> notFilterUrls;
	
	public void setNotFilterUrls(List<String> notFilterUrls) {
		this.notFilterUrls = notFilterUrls;
	}
	
	public void setLoginUrl(String loginUrl) {
		this.loginUrl = loginUrl;
	}
	
	public void setSuccessUrl(String successUrl) {
		this.successUrl = successUrl;
	}
	
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		boolean isNoFilterUrl = false;
		//得到网站的根路径
		String ctx = request.getContextPath();
		//如果没有登录，验证是否访问的是非过滤地址
		if (CollectionUtils.isNotEmpty(notFilterUrls)) {
			String requestUrl = request.getRequestURI();
			for (String notFilterUrl : notFilterUrls) {
				if (requestUrl.startsWith(ctx + notFilterUrl)) {
					isNoFilterUrl = true;
					break;
				}
			}
		}
		//判断是否已经登录
		MemberInfo member = (MemberInfo) request.getSession().getAttribute(loginSessionToken);
		if (member != null && member.getId() > 0 && StringUtils.isNotEmpty(member.getUsername())) {
			//如果会员已经登录
			if (isNoFilterUrl) {
				//但是访问的是无需验证的url 那么跳入成功页面
				response.sendRedirect(ctx + successUrl);
				return false;
			} else {
				//如果不是 直接访问
				return true;
			}
		} else {
			//如果会员没有登录
			if (isNoFilterUrl) {
				//并且访问的是无需验证的url 那么直接跳转
				return true;
			} else {
				//否则重定向到登录页面
				response.sendRedirect(ctx + loginUrl);
				return false;
			}
		}
	}
	
}
